package com.colin.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

/**
 * redis客户端常用API分装
 * Created by zhaolz on 2017/12/15.
 */
@Component
public class JedisClient {
    @Autowired
    private JedisPool jedisPool;

    /**
     * 字符串添加
     * @param key
     * @param value
     * @throws Exception
     */
    public void set(String key, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.set(key, value);
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 字符串获取
     * @param key
     * @return
     * @throws Exception
     */
    public String get(String key) throws Exception  {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String result = jedis.get(key);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 确认一个key是否存在
     * @param key
     * @return
     * @throws Exception
     */
    public boolean exists(String key) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            boolean flag = jedis.exists(key);
            return flag;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 删除一个key
     * @param key
     * @throws Exception
     */
    public void del(String key) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.del(key);
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 设定一个key的活动时间（s）
     * @param key
     * @param time
     * @return 设置成功返回 1 ,
     * 当 key 不存在或者不能为 key 设置生存时间时返回 0 。
     * @throws Exception
     */
    public Long expire(String key, int time) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Long result = jedis.expire(key, time);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 获得一个key的活动时间(毫秒)
     * @param key
     * @return
     * @throws Exception
     */
    public Long ttl(String key) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Long result = jedis.ttl(key);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 向库中添加string（名称为key，值为value）同时，设定过期时间time(秒)
     * @param key
     * @param time
     * @param value
     * @throws Exception
     */
    public void setex(String key, int time, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.setex(key, time, value);
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 如果不存在名称为key的string，则向库中添加string，名称为key，值为value
     * @param key
     * @param value
     * @throws Exception
     */
    public void setnx(String key, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.setnx(key, value);
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 在名称为key的list尾添加一个值为value的元素
     * @param key
     * @param value
     * @throws Exception
     */
    public void rpush(String key, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.rpush(key, value);
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 在名称为key的list头添加一个值为value的 元素
     * @param key
     * @param value
     * @throws Exception
     */
    public void lpush(String key, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.lpush(key, value);
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 返回名称为key的list的长度
     * @param key
     * @param value
     * @return
     * @throws Exception
     */
    public Long llen(String key, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Long len = jedis.llen(key);
            return len;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 返回名称为key的list中start至end之间的元素（下标从0开始，下同）
     * @param key
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public List<String> lrange(String key, Long start, Long end) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            List<String> result = jedis.lrange(key, start, end);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 截取名称为key的list，保留start至end之间的元素
     * @param key
     * @param start
     * @param end
     * @return
     * @throws Exception
     */
    public String ltrim(String key, Long start, Long end) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String result = jedis.ltrim(key, start, end);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 返回名称为key的list中index位置的元素
     * @param key
     * @param index
     * @return
     * @throws Exception
     */
    public String lindex(String key, Long index) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String result = jedis.lindex(key, index);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 给名称为key的list中index位置的元素赋值为value,操作成功，返回OK
     * @param key
     * @param index
     * @param value
     * @return OK
     * @throws Exception
     */
    public String lset(String key, Long index, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String result = jedis.lset(key, index, value);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 删除count个名称为key的list中值为value的元素。
     * count为0，删除所有值为value的元素，count>0
     * 从头至尾删除count个值为value的元素，count<0从尾到头删除|count|个值为value的元素。
     * @param key
     * @param count
     * @param value
     * @return 被移除元素的数量,列表不存在时返回0
     * @throws Exception
     */
    public Long lrem(String key, Long count, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Long result = jedis.lrem(key, count, value);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 将哈希表 key 中的域 field 的值设为 value 。
     * 如果 key 不存在，一个新的哈希表被创建并进行 HSET 操作。
     * 如果域 field 已经存在于哈希表中，旧值将被覆盖
     * @param key
     * @param field
     * @param value
     * @return 如果 field 是哈希表中的一个新建域，并且值设置成功，返回 1 。
     *         如果哈希表中域 field 已经存在且旧值已被新值覆盖，返回 0
     * @throws Exception
     */
    public Long hset(String key, String field, String value) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            Long result = jedis.hset(key, field, value);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

    /**
     * 返回名称为key的hash中field对应的value
     * @param key
     * @param field
     * @return
     * @throws Exception
     */
    public String hget(String key, String field) throws Exception {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            String result = jedis.hget(key, field);
            return result;
        } finally {
            //返还到连接池
            jedis.close();
        }
    }

}
